package mail.util;

import java.io.*;
import java.nio.charset.Charset;
import java.util.Objects;

/**
 * @Author: Hanjiafeng
 * @Date: Created in 11:44 2019/1/25
 * @Desc: 文件管理器
 */
public class FileManager {


    /**
     * 将内容以覆写的形式写入指定文件名,如果文件不存在,创建新文件
     *
     * @param fileName  文件路径
     * @param fileBytes 文件内容
     * @throws IOException 异常
     */
    public static void overwrite(String fileName, byte[] fileBytes) throws IOException {
        write(fileName, fileBytes, false);
    }

    /**
     * 将内容以追加的形式写入指定文件名,如果文件不存在,创建新文件
     *
     * @param fileName  文件路径
     * @param fileBytes 文件内容
     * @throws IOException 异常
     */
    public static void appendWrite(String fileName, byte[] fileBytes) throws IOException {
        write(fileName, fileBytes, true);
    }

    /**
     * 写入文件内容,如果文件不存在,创建文件
     *
     * @param fileName 文件名
     * @param bytes    bytes
     * @param isAppend 写入方式,true,末尾追加,false:覆写
     * @throws IOException io
     */
    private static void write(String fileName, byte[] bytes, boolean isAppend) throws IOException {
        File file = new File(fileName);
        //获取父文件夹
        File parentFile = file.getParentFile();
        //如果父文件夹不存在,创建
        if (!parentFile.exists()) {
            //创建父文件夹
            boolean t = parentFile.mkdirs();
            if (!t) {
                throw new IOException("创建文件夹" + parentFile + "失败");
            }
        }
        try (FileOutputStream fileOutputStream = new FileOutputStream(fileName, isAppend)) {
            fileOutputStream.write(bytes);
        }
    }

    /**
     * 写入文件内容,如果文件不存在,创建文件
     *
     * @param fileName 文件名
     * @param content  内容
     * @param charset  编码方式
     * @param isAppend 写入方式,true,末尾追加,false:覆写
     * @throws IOException io
     */
    private static void write(String fileName, String content, Charset charset, boolean isAppend) throws IOException {
        File file = new File(fileName);
        //获取父文件夹
        File parentFile = file.getParentFile();
        //如果父文件夹不存在,创建
        if (!parentFile.exists()) {
            //创建父文件夹
            boolean t = parentFile.mkdirs();
            if (!t) {
                throw new IOException("创建文件夹" + parentFile + "失败");
            }
        }
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(file, charset, isAppend))) {
            writer.write(content);
        }
    }

    /**
     * 追加文件内容
     *
     * @param fileName 文件名
     * @param content  内容
     * @param charset  编码方式
     * @throws IOException io
     */
    public static void appendWrite(String fileName, String content, Charset charset) throws IOException {
        write(fileName, content, charset, true);
    }

    /**
     * 重写文件
     *
     * @param fileName 文件名
     * @param content  内容
     * @param charset  编码方式
     * @throws IOException io
     */
    public static void overwrite(String fileName, String content, Charset charset) throws IOException {
        write(fileName, content, charset, false);
    }

    /**
     * 使用指定编码读取文件
     *
     * @param fileName 文件名
     * @param charset  编码
     * @return 文件内容
     * @throws IOException io
     */
    public static String read(String fileName, Charset charset) throws IOException {
        var body = new StringBuilder();
        try (BufferedReader reader = new BufferedReader(new FileReader(fileName, charset))) {
            String line;
            while (!Objects.isNull(line = reader.readLine())) {
                body.append(line).append("\n");
            }
        }

        return body.toString();
    }

    public static byte[] read(String fileName) throws IOException {
        byte[] bytes;
        try (FileInputStream fileInputStream = new FileInputStream(fileName)) {
            bytes = new byte[fileInputStream.available()];
            fileInputStream.read(bytes);
        }

        return bytes;
    }
}
